package com.cskaoyan.javase.oop1._11static._0introduction._1new;

import com.cskaoyan.javase.oop1._11static._0introduction._0old.Demo;

/**
 * 所以说一千道一万，"学校信息"这个属性不应该定义为"成员变量"，而应该考虑定义一种"全新的，属于类的"变量。
 *
 * 实际上，属于类的变量在Java当中是存在的，即使用static关键字修饰的，Java当中的静态成员变量。
 *
 * 静态成员变量的语法,就是在成员变量的基础上加了static修饰:
 * [访问权限修饰符] statics 数据类型 变量名;
 * 除了属于类多了一个static修饰,静态成员变量在定义时,和成员变量是一样的
 *
 * 静态成员变量的使用:
 *      1.有默认值,而且默认值的赋值,默认初始化不可省略,也是最先执行的
 *          默认值和成员变量的默认值是一样的
 *          也可以进行显式赋值,同样显式赋值会在默认初始化之后执行,会覆盖默认值
 *
 *      2.静态成员变量属于全体对象所共享,使用一个对象修改会影响到所有对象
 *
 *      3.(重点)用对象名(引用)访问静态成员变量是不合适的,更合适的方法是用类名点访问.(因为它属于类)
 *      实际开发中,严格禁止用引用访问静态成员变量(虽然语法允许)
 *
 *      4.(重点)静态成员变量的使用和有无对象,完全没有关系.即便没有对象,也可以直接用类名点访问静态成员变量.
 *
 * static修饰成员变量就是静态成员变量,那么static修饰成员方法就得到静态成员方法
 * 我们在开发中,将静态成员变量和静态成员方法统称为类的静态成员
 * 类的成员: 成员变量 + 成员方法
 * 类的静态成员: 静态成员变量 + 静态成员方法
 *
 * 静态成员方法的语法:
 * [访问权限修饰符] statics 返回值类型 方法名(形参列表){
 *     // 方法体
 * }
 * 静态方法:
 *      1.不要用对象名点调用(虽然语法也允许)而是用类名点调用
 *      特殊的:
 *      当static方法处在同一个类中时,
 *      可以直接用"方法名"调用
 *      省略了类名
 *
 *      2.和对象没有关系,可以直接类名点调用.
 *
 * @since 11:35
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class NewDemo {
    public static void main(String[] args) {
        // Java44Student s1 = new Java44Student();
        // Java44Student s2 = new Java44Student();
        // Static member 'com.cskaoyan.javase.oop1._11static._0introduction._1new.Java44Student.schoolName' accessed via instance reference
        // System.out.println(s1.schoolName);
        // s1.schoolName = "C++训练营";
        // System.out.println(s2.schoolName);

        System.out.println(Java44Student.schoolName);
        Java44Student.schoolName = "Python训练营";
        System.out.println(Java44Student.schoolName);

        Java44Student.test();
        test();
        // 上面方法调用补全
        NewDemo.test();
    }
    public static void test(){}
}

class Java44Student {
    String name;
    String gender;
    int age;
    int id;
    // 需要一个属于类的静态成员变量来描述学校信息
    static String schoolName = "王道训练营";

    public Java44Student() {
    }

    public Java44Student(String name, String gender, int age, int id) {
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.id = id;
    }

    public Java44Student(String name, String gender, int age, int id, String schoolName) {
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.id = id;
        this.schoolName = schoolName;
    }

    public void eat() {
        System.out.println("我今天中文想去吃牛肉拉面~~");
    }

    public void study() {
        System.out.println("我学习的时候从不想别的~~");
    }

    public static void test(){}
}